﻿using System;
using System.Linq;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using DbTaglio.SvcLayer;
using DbTaglio.SvcLayer.DbTaglioService;

namespace Gucci.DbTaglio.Site.Wp.Consumi_dbtWp
{
    [ToolboxItem(false)]
    public partial class Consumi_dbtWp : System.Web.UI.WebControls.WebParts.WebPart
    {
        string _idargs = "", _codfornitore = "", _descrizione = "", _codice = "", _codMateriale = "", _spUserName = "";
        DBTWinLogin _loginUserData  = null;
        SPUser _spUser = null;
        bool _isAbilitatoAlConsumo = false, _isAdmin= false;
                
       
        # region LOGIN - DATI UTENTE

        DBTManager _manager = null;
        private string getSPuser()
        {
            _spUser = SPContext.Current.Web.CurrentUser;

            var arr = _spUser.Name.Split(new[] { "\\" }, StringSplitOptions.RemoveEmptyEntries);
            if (arr != null && arr.Length > 1)
                _spUserName = arr[1];

            return _spUserName;
        }
        
        #endregion

        protected override void OnInit(EventArgs e)
        {
            base.OnInit(e);
            InitializeControl();
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            _manager = new DBTManager(getSPuser()); 
            var result = _manager.EnsureLogin(HiddenCodiceFornitore.Value,HiddenIsAdmin.Value);

            if (result.HaErrori)
            {
                LabelErrori.Text = result.Eccezione.Message;
                return;
            }

            if (!Page.IsPostBack)
            {
                ImpostaLayout();
                LoadDecodifiche();
                txt_Data.Focus();
            }            
        }

              
        private void ImpostaLayout()
        {
            txt_Data.Attributes.Add("onkeypress", "javascript:return allowOnlyData(event);");
            txt_OreRilevate.Attributes.Add("onkeypress","javascript:return allowOnlyNumbers(event);");
            txt_QtaPrevista.Attributes.Add("onkeypress","javascript:return allowOnlyNumbers(event);");
            txt_QtaResidua.Attributes.Add("onkeypress", "javascript:return allowOnlyNumbers(event);");
            txt_DataRilievo.Attributes.Add("onkeypress", "javascript:return allowOnlyData(event);");
                     
        }

 

        private void LoadDecodifiche()
        {
            //Se admin li carico tutti altrimenti solo il terzista loggato
            if (_manager.DatiUtenteLogin.Dati.DBTAppUser.IsAdminAppRole)
            {
                var terzisti = _manager.ProxyGetWcf.getTerzisti(true);
                _manager.setDropDown(terzisti, drop_Fornitore, "RagioneSocialeTerzista", "CodiceTerzista", LabelErrori);
            }
            else if (_manager.DatiUtenteLogin.Dati.DBTAppUser.IsFornitore)
            {
                _manager.setDropDownSingleVal<Terzista>(
                    new RetData<Terzista>(_manager.DatiUtenteLogin.Dati.DatiFornitore), drop_Fornitore,
                   _manager.DatiUtenteLogin.Dati.DatiFornitore.RagioneSocialeTerzista,
                   _manager.DatiUtenteLogin.Dati.DatiFornitore.CodiceTerzista, LabelErrori);

                LoadDatiDelFornitore();

            }
           
            
 
            //Causale
            var causali = _manager.ProxyGetWcf.getCausali(null, 0);
            _manager.setDropDown<Causale[]>(causali, drop_Causale, "DescrizioneCausale", "IdCausale", LabelErrori);
            

           //Codice materiale
            var materiali = _manager.ProxyGetWcf.getMasterItems(new ItemSearchModel(), true);
            _manager.setDropDown<MasterItem[]>(materiali, drop_CodMat, "ItemDisplayName", "ItemId", LabelErrori);
           

           //Colore -> caricato dopo al caricamento materiale
 

            //Stagione
            var stagioni = _manager.ProxyGetWcf.getStagioni(true);
            _manager.setDropDown<Stagione[]>(stagioni, drop_Stagione, "StagioneId", "StagioneId", LabelErrori);

            

   
            }

        private void LoadDatiDelFornitore()
        {
            //carico il tipo macchina e gli operatori 
            // internamente fanno la query col codice fornitore altrimenti nulla, IS IT ?
            LoadTipoMacchina();
            LoadOperatore();

            //Conceria
            var concerie = _manager.ProxyGetWcf.getConcerie(new ConceriaSearchModel() { CodiceFornitore = _codfornitore });
            _manager.setDropDown<Conceria[]>(concerie, drop_Conceria, "DescrizioneConceria", "IdConceria", LabelErrori);
            //TODO : aggiungere Pezzami alle concerie !

            //Commessa -> caricato al caricamento materiale
            var filter = new CommessaSearchModel() { CodiceTerzista = _codfornitore  };
            var commesse = _manager.ProxyGetWcf.getCommesse(filter, true);
            _manager.setDropDown<Commessa[]>(commesse, drop_Commessa, "CodiceCommessaCompleto", "CodiceCommessaCompleto", LabelErrori);

            
        }



        protected void Azioni_Click(object sender, ImageClickEventArgs e)
        {
            var btn = (ImageButton)sender;
            var azione = btn.CommandName;
            //_IDargs = btn.CommandArgument; //id


            switch (azione)
            {
                case "Save":
                    saveDati();
                    break;
                default:
                    break;
            }

        }//fM

        private void saveDati()
        {
            var dati = getDichiarazioneToSave();
                        

            if (dati.HaErrori)
            { //ci sono errori da notificare
                string erroriStr = "";
                if (dati.ErroriList != null)
                    dati.ErroriList.Select(xx => erroriStr += xx + "\r\n");

                LabelErrori.Text = erroriStr ; 
            }
            else
            {   //Salvataggio dati 
                var setter = new MetSet(null, null, true);
                var result = setter.updateDichiarazioni(dati.Dati, false);
            }
        }

        private RetData<Dichiarazione> getDichiarazioneToSave()
        {
            bool IsInItalianFormat = true;
            Dichiarazione dichiarazione = new Dichiarazione();
            var validator = new global::DbTaglio.SvcLayer.DichiarazioniValidator(dichiarazione); 


            //Validazione iniziale sui valori per le textbox
            //Non serve validare i tipi per le drop perché già OK
            //Verranno validate poi per assicurare la presenza di valore adotto o meno!

            if(validator.ValidateDate(txt_Data.Text))
                dichiarazione.DataInserimento = validator.GetDateFromString(txt_Data.Text, IsInItalianFormat);

            if (validator.CanConvertTo<string>(drop_Fornitore.SelectedValue))
                dichiarazione.CodiceFornitore = validator.Convert<string>(drop_Fornitore.SelectedValue);

            //Macchina
            if (validator.CanConvertTo<int>(drop_TipoMacchina.SelectedValue))
                dichiarazione.IdMacchina = validator.Convert<int>(drop_TipoMacchina.SelectedValue);

            //Causale
            if (validator.CanConvertTo<int>(drop_Causale.SelectedValue))
                dichiarazione.IdCausale = validator.Convert<int>(drop_Causale.SelectedValue);

            //Operativita
            if (validator.CanConvertTo<int>(drop_Operativita.SelectedValue))
                dichiarazione.IdOperativita = validator.Convert<int>(drop_Operativita.SelectedValue);
            
            //Operatore 1
            if (validator.CanConvertTo<int>(drop_Operat1.SelectedValue))
                dichiarazione.IdOper1  = validator.Convert<int>(drop_Operat1.SelectedValue);
            
            //Operatore 2
            if (validator.CanConvertTo<int>(drop_Operat2.SelectedValue))
                dichiarazione.IdOper2 = validator.Convert<int>(drop_Operat2.SelectedValue);

            //Hstop
            if (validator.CanConvertTo<string>(txt_HStop.Text))
                dichiarazione.HStop = validator.Convert<string>(txt_HStop.Text);
            
            //ore rilevate
            if (validator.CanConvertTo<double>(txt_OreRilevate.Text))
                dichiarazione.OreRilOper1 = validator.Convert<double>(txt_OreRilevate.Text);

            //data rilievo
            if (validator.ValidateDate(txt_DataRilievo.Text))
                dichiarazione.DataInserimento = validator.GetDateFromString(txt_DataRilievo.Text, IsInItalianFormat);

            //Operazione
            if (validator.CanConvertTo<string>(drop_Operazione.SelectedValue))
                dichiarazione.OperazioneOper1 = validator.Convert<string>(drop_Operazione.SelectedValue);

            //Codice Materiale
            if (validator.CanConvertTo<string>(drop_CodMat.SelectedValue))
                dichiarazione.CodiceMateriale = validator.Convert<string>(drop_CodMat.SelectedValue);
             

            // Codice Colore
            if (validator.CanConvertTo<string>(drop_Colore.SelectedValue))
                dichiarazione.CodiceColore = validator.Convert<string>(drop_Colore.SelectedValue);
            
             // Stagione 
            if (validator.CanConvertTo<string>(drop_Stagione.SelectedValue))
                dichiarazione.CodiceStagione = validator.Convert<string>(drop_Stagione.SelectedValue);

            //Pezzami
            dichiarazione.Pezzami = Check_Pezzami.Checked;
            
            //Conceria
            if (validator.CanConvertTo<int>(drop_Conceria.SelectedValue))
                dichiarazione.IdConceria = validator.Convert<int>(drop_Conceria.SelectedValue);

            //Verbale 
            if (validator.CanConvertTo<int>(drop_NVerbale.SelectedValue))
                dichiarazione.IdVerbale = validator.Convert<int>(drop_NVerbale.SelectedValue);
            
            //Lotto
            if (validator.CanConvertTo<string>(txt_Lotto.Text))
               dichiarazione.Lotto = validator.Convert<string>(txt_Lotto.Text);

            //Bolla
            if (validator.CanConvertTo<string>(txt_NBolla.Text))
                dichiarazione.Bolla = validator.Convert<string>(txt_NBolla.Text);

            //Commessa 
            if (validator.CanConvertTo<string>(drop_Commessa.SelectedValue))
                dichiarazione.CodiceCommessa = validator.Convert<string>(drop_Commessa.SelectedValue);

            //Pelle 1
            if (validator.CanConvertTo<double>(txt_Pelle1.Text))
                dichiarazione.Qta1a  = validator.Convert<double>(txt_Pelle1.Text);

            //Pelle 2
            if (validator.CanConvertTo<double>(txt_Pelle2.Text))
                dichiarazione.Qta2a = validator.Convert<double>(txt_Pelle2.Text);

            //Pelle 3
            if (validator.CanConvertTo<double>(txt_Pelle3.Text))
                dichiarazione.Qta3a = validator.Convert<double>(txt_Pelle3.Text);

            //Pelle 4
            if (validator.CanConvertTo<double>(txt_Pelle4.Text))
                dichiarazione.Qta4a = validator.Convert<double>(txt_Pelle4.Text);

            // Note
            dichiarazione.Note = txt_Note.Text;  

            //
            //<<<<<<<<<<<<************>>>>>>>>>>>>

            //validazione con regole custom a seconda dell tipo utente
            var errori = validator.Convalida(ValidationLevel.ALL);


            //Return del risultato con lista di errori o meno
            if(errori.Count() > 0)
                return new RetData<Dichiarazione>(new Exception("Errori nella dichiarazione"), errori);
            else
                return new RetData<Dichiarazione> (dichiarazione);

        }//fM

        
        protected bool ValidateDate(string date, bool pIsInItalianFormat, char pSeparator , out DateTime pResult)
        {
            pResult = DateTime.MinValue;
            try
            {
                if (string.IsNullOrEmpty(date.Trim()))
                    return false;

                string[] dateParts = date.Split(pSeparator); // pSeparator = '/'

                if (pIsInItalianFormat)
                pResult = new
                    DateTime(Convert.ToInt32(dateParts[2]),
                    Convert.ToInt32(dateParts[1]),
                    Convert.ToInt32(dateParts[0]));
                else //english format ? 
                    pResult = new
                    DateTime(Convert.ToInt32(dateParts[2]),
                    Convert.ToInt32(dateParts[0]),
                    Convert.ToInt32(dateParts[1]));

                return true;
            }
            catch
            {
                return false;
            }
        }

        protected void drop_Fornitore_SelectedIndexChanged(object sender, EventArgs e)
        {
            string codice = ((DropDownList)sender).SelectedValue;
            _codfornitore = codice;

            if (codice == "-1") return;

            LoadTipoMacchina();
            LoadOperatore();
        }


        /// <summary>
        /// Al caricamento del materiale carico anche i rispettivi colori e le rispettive commesse
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void drop_CodMat_SelectedIndexChanged(object sender, EventArgs e)
        {
            string codiceMat = ((DropDownList)sender).SelectedValue;
            if (codiceMat == "-1") return;

            LoadColoriMateriale(codiceMat);
            LoadCommesseMateriale();

            drop_Colore.Focus(); 
        }

        // TODO : load della commessa in base al materiale e colore
        private void LoadCommesseMateriale()
        {
            var materiale = drop_CodMat.SelectedValue; //ItemID
            var colore = drop_Colore.SelectedValue;   //CodiceColore


        }

        private void LoadColoriMateriale(string pCodiceMat)
        {
            //Colore materiale
            var result = _manager.ProxyGetWcf.getColoriComponente(pCodiceMat);
            _manager.setDropDown<Colore[]>(result, drop_Colore, "DescrizioneColore", "CodiceColore", LabelErrori, true);            
        }


        private void LoadTipoMacchina()
        {
            //Tipo Macchina

            var result = _manager.ProxyGetWcf.getMacchine( new DBTGenFiter(){ CodiceForn = _manager.CodFornitore } );
            _manager.setDropDown<Macchina[]>(result, drop_TipoMacchina, "CodiceMacchina", "IdMacchina", LabelErrori, true);
        }

        private void LoadOperatore()
        {

            var result = _manager.ProxyGetWcf.getOperatori(
                 new DBTGenFiter() { CodiceForn = _manager.CodFornitore  });

            _manager.setDropDown<Operatore[]>(result, drop_Operat1, "NomeOperatore", "IdOperatore", LabelErrori, true);
            _manager.setDropDown<Operatore[]>(result, drop_Operat2, "NomeOperatore", "IdOperatore", LabelErrori, true);
        }

        protected void txt_Pelle_TextChanged(object sender, EventArgs e)
        {
            var txt = ((TextBox)sender).Text;
            if (string.IsNullOrEmpty(txt)) return;

            double cons = 0, tot =0;

            if (double.TryParse(txt, out cons))
            {
                txt = txt_ConsumoRilevato.Text;
                if (string.IsNullOrEmpty(txt)) return;

                if (double.TryParse(txt, out tot))
                {                    
                    txt_ConsumoRilevato.Text = Math.Round((tot + cons),2) .ToString();
                }

            }

        }

        protected void Check_Pezzami_CheckedChanged(object sender, EventArgs e)
        {
            bool check = ((CheckBox)sender).Checked;

            SetOnClickPEZZAMI(check);

        }

        private void SetOnClickPEZZAMI(bool pChecked)
        {
            drop_NVerbale.Enabled = !pChecked ;
            if (pChecked)
            {
                var selit = drop_NVerbale.SelectedValue;
                if(!string.IsNullOrEmpty(selit))
                    drop_NVerbale.Items.FindByValue(selit).Selected = false;

                var it = drop_NVerbale.Items.FindByValue("-1");
                if(it != null)
                    it.Selected = true;
            }

            
            
            if (pChecked)
            {
               var selit =  drop_Conceria.SelectedValue;
               if (!string.IsNullOrEmpty(selit))
                drop_Conceria.Items.FindByValue(selit).Selected = false;

               //TODO : aggiungere Pezzami alle concerie ! << fatto via codice
               var it =drop_Conceria.Items.FindByValue("Pezzami");
               if (it == null)
               {
                   var pezz = new ListItem("Pezzami", "Pezzami", true);
                   pezz.Selected = true;
                   drop_Conceria.Items.Add(pezz);

               }
               if (it != null)
                   it.Selected = true;
            }

            txt_Lotto.Text = "";
            txt_Lotto.Enabled = !pChecked;

            txt_NBolla.Text = "";
            txt_NBolla.Enabled = !pChecked;
        }




    }
}
